#include <stdio.h>
#include <setjmp.h>

jmp_buf env0; // 锚定 main 中的点
jmp_buf env1; // 锚定 func1 中的点
jmp_buf env2; // 锚定 func2 中的点

enum SIG
{
    FUNC1_ONE = 100,
    FUNC1_TWO,
    FUNC2_ONE,
    FUNC2_TWO,
};

void func2()
{
    int ret = setjmp(env2);
    if (ret == 0)
    {
        printf("好");
        longjmp(env0, FUNC2_ONE);
    }
    else
    {
        printf("界");
        longjmp(env0, FUNC2_TWO);
    }
}

void func1()
{

    int ret = setjmp(env1);
    if (ret == 0)
    {
        printf("你");
        longjmp(env0, FUNC1_ONE);
    }

    else
    {
        printf("世");
        longjmp(env0, FUNC1_TWO); 
    }
}

int main()
{
    int ret = setjmp(env0);

    switch (ret)
    {
    case 0:
    {
        func1();
        break;
    }

    case FUNC1_ONE:
    {
        func2();
        break;
    }

    case FUNC1_TWO:
     {
        longjmp(env2, 2);
        break;
    }

    case FUNC2_ONE:
     {
        longjmp(env1, 2);
        break;
    }

    case FUNC2_TWO:
     {
        printf("!\n");
        break;
    }

    default:
        break;
    }

    return 0;
}